#include <memory>
#include <vector>
#include <iostream>
using namespace std;
class Child;
class Parent{
public:
    Parent(){
        cout << "Parent()"  << endl;
    }

    ~Parent(){
        cout << "~Parent()" << endl;
    }

    shared_ptr<Child> _spChild;
};

class Child{
public:
    Child(){
        cout << "Child" << endl;
    }

    ~Child(){
        cout << "~Child()" << endl;
    }

    weak_ptr<Parent> _spParent;
};

// 验证shared_ptr的循环引用问题
// 上面两个类的成员变量是对方的情况下
// 进行如下的操作之后会发生什么？
void test1(){
    shared_ptr<Parent> sp1(new Parent());
    shared_ptr<Child> sp2(new Child());
    cout << sp1.use_count() << endl;
    cout << sp2.use_count() << endl;
    // 在这里都是正常的创建了两个对象
    // 下面进行对象的成员变量的赋值
    sp1->_spChild = sp2;
    sp2->_spParent = sp1;
    cout << sp1.use_count() << endl;
    cout << sp2.use_count() << endl;


    // 结论：
    // 发现此时有堆空间的内存泄漏问题
    // 因为此时他们中的子类
    // 互相把对方作为指向对象
    // 此时指向两个对象的堆空间的引用计数变成了2
    // 而当你对象的指针销毁的时候
    // 你的成员变量的指针还没有销毁
    // 此时无法将堆空间释放，此时引用计数剩余1
    //
    // 解决办法：
    // 将
    //  16: shared_ptr<Child> _spChild;
    //  29: shared_ptr<Parent> _spParent;
    //  两个对象其中一个的成员对象设置成weak_ptr管理的即可解决    

}

void test2(){

    shared_ptr<Parent> sp1(new Parent());
    shared_ptr<Child> sp2(new Child());
    cout << sp1.use_count() << endl;
    cout << sp2.use_count() << endl;
    // 在这里都是正常的创建了两个对象
    // 下面进行对象的成员变量的赋值
    sp1->_spChild = sp2;
    sp2->_spParent = sp1;
    cout << sp1.use_count() << endl;
    cout << sp2.use_count() << endl;
}

int main(int atgc, char * argv[])
{
    test1();
    return 0;
}

